#!/bin/bash
#
# fdsmastergo    启动/停止FDS Master Go服务
#
# chkconfig: 2345 90 10
# description: FDS Master Go服务管理脚本
# processname: fdsmastergo
# pidfile: /var/run/fdsmastergo.pid

### BEGIN INIT INFO
# Provides:          fdsmastergo
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: FDS Master Go服务
# Description:       FDS Master Go服务管理脚本
### END INIT INFO

# 安装路径（安装时会被替换）
INSTALL_DIR="__INSTALL_FULL_PATH__"
SERVICES_JSON="$INSTALL_DIR/services.json"
PIDFILE="/var/run/fdsmastergo.pid"

# 服务列表和延时参数硬编码，与services.json中的start_order和delay保持一致
# 这样做是为了避免解析JSON，提高脚本的可靠性
SERVICES=("config_server" "bluetooth_server" "cloud_server" "monitor_server" "web_server")
DELAYS=(2 3 2 2 1)

# 打印信息
info() {
    echo "[信息] $1"
}

warn() {
    echo "[警告] $1"
}

error() {
    echo "[错误] $1"
}

# 启动服务
start() {
    info "正在启动 FDS Master Go 服务..."
    info "安装目录: $INSTALL_DIR"
    info "配置文件: $SERVICES_JSON"
    info "PID文件: $PIDFILE"
    
    # 检查服务是否已经在运行
    if [ -f "$PIDFILE" ]; then
        PID=$(cat "$PIDFILE")
        info "发现PID文件，PID: $PID"
        if kill -0 "$PID" 2>/dev/null; then
            warn "服务已经在运行 (PID: $PID)"
            return 0
        else
            # PID文件存在但进程不存在，删除PID文件
            info "PID文件存在但进程不存在，删除PID文件"
            rm -f "$PIDFILE"
        fi
    else
        info "未发现PID文件，服务未运行"
    fi
    
    # 检查配置文件
    # 注意：虽然服务列表是硬编码的，但services.json仍然是必要的配置文件
    # 因为服务程序在运行时会读取此文件获取配置信息
    if [ ! -f "$SERVICES_JSON" ]; then
        error "未找到配置文件: $SERVICES_JSON"
        info "当前目录: $(pwd)"
        info "目录内容: $(ls -l $INSTALL_DIR 2>/dev/null || echo '目录不存在')"
        return 1
    else
        info "找到配置文件: $SERVICES_JSON"
    fi
    
    info "服务列表: ${SERVICES[*]}"
    info "延时参数: ${DELAYS[*]}"
    
    # 创建日志目录
    info "创建日志目录: $INSTALL_DIR/cmd/logs"
    mkdir -p "$INSTALL_DIR/cmd/logs"
    
    # 启动所有服务
    for i in "${!SERVICES[@]}"; do
        service="${SERVICES[$i]}"
        delay="${DELAYS[$i]}"
        
        SERVICE_BIN="$INSTALL_DIR/cmd/$service/bin/$service"
        LOG_DIR="$INSTALL_DIR/cmd/logs/$service"
        
        info "处理服务: $service (启动后延时: ${delay}秒)"
        info "可执行文件路径: $SERVICE_BIN"
        info "日志目录: $LOG_DIR"
        
        # 检查可执行文件是否存在
        if [ ! -f "$SERVICE_BIN" ]; then
            error "服务可执行文件不存在: $SERVICE_BIN"
            info "目录内容: $(ls -l $INSTALL_DIR/cmd/$service/bin 2>/dev/null || echo '目录不存在')"
            continue
        elif [ ! -x "$SERVICE_BIN" ]; then
            warn "服务可执行文件存在但没有执行权限: $SERVICE_BIN"
            info "尝试添加执行权限"
            chmod +x "$SERVICE_BIN" || error "无法添加执行权限"
            continue
        else
            info "服务可执行文件存在且有执行权限"
        fi
        
        # 创建日志目录
        info "创建日志目录: $LOG_DIR"
        mkdir -p "$LOG_DIR"
        
        # 启动服务
        info "启动服务: $service"
        info "执行命令: $SERVICE_BIN > /dev/null 2> /dev/null &"
        $SERVICE_BIN > /dev/null 2> /dev/null &
        LAUNCH_RESULT=$?
        info "启动命令返回值: $LAUNCH_RESULT"
        
        # 等待服务启动
        info "等待服务启动..."
        sleep 1
        
        # 检查服务是否成功启动
        ps | grep -w "$service" | grep -v grep > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            info "服务 $service 已成功启动"
        else
            warn "服务 $service 可能未成功启动，检查日志目录: $LOG_DIR"
            info "日志内容: $(ls -l $LOG_DIR 2>/dev/null || echo '无法访问日志目录')"
        fi
        
        # 应用延时
        if [ "$delay" -gt 0 ]; then
            info "等待 ${delay} 秒后启动下一个服务..."
            sleep "$delay"
        fi
    done
    
    # 记录主进程PID（使用第一个服务的PID）
    FIRST_SERVICE="${SERVICES[0]}"
    info "获取第一个服务的PID: $FIRST_SERVICE"
    PID=$(ps | grep -w "$FIRST_SERVICE" | grep -v grep | awk '{print $1}' | head -1 2>/dev/null)
    if [ -n "$PID" ]; then
        info "找到PID: $PID，写入PID文件: $PIDFILE"
        echo "$PID" > "$PIDFILE"
        info "所有服务已启动"
        return 0
    else
        error "服务启动失败，未找到 $FIRST_SERVICE 的PID"
        info "进程列表: $(ps 2>/dev/null || echo '无法获取进程列表')"
        return 1
    fi
}

# 停止服务
stop() {
    info "正在停止 FDS Master Go 服务..."
    
    # 使用硬编码的服务列表（倒序停止）
    local services_count=${#SERVICES[@]}
    
    # 构建并显示倒序服务列表
    local reverse_services=()
    for (( i=${services_count}-1; i>=0; i-- )); do
        reverse_services+=("${SERVICES[$i]}")
    done
    info "停止服务顺序: ${reverse_services[*]}"
    
    # 倒序遍历服务数组
    for (( i=${services_count}-1; i>=0; i-- )); do
        service="${SERVICES[$i]}"
        info "停止服务: $service"
        ps | grep -w "$service" | grep -v grep | awk '{print $1}' | xargs kill 2>/dev/null || true
        sleep 1
    done
    
    # 删除PID文件
    rm -f "$PIDFILE"
    
    info "所有服务已停止"
    return 0
}

# 重启服务
restart() {
    stop
    sleep 2
    start
}

# 检查服务状态
status() {
    echo "FDS Master Go 服务状态:"
    echo "------------------------------------"
    
    # 检查所有服务状态
    ALL_RUNNING=true
    for service in "${SERVICES[@]}"; do
        # 使用更精确的匹配方式，确保只匹配完整的进程名
        # 使用-w参数确保完全匹配单词
        ps | grep -w "$service" | grep -v grep > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            # 获取PID并格式化输出
            PID=$(ps | grep -w "$service" | grep -v grep | awk '{print $1}' | head -1)
            echo "[运行中] $service (PID: $PID)"
        else
            echo "[已停止] $service"
            ALL_RUNNING=false
        fi
    done
    
    echo "------------------------------------"
    if $ALL_RUNNING; then
        echo "所有服务正在运行"
        return 0
    else
        echo "部分服务未运行"
        return 1
    fi
}

# 根据命令行参数执行相应操作
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit $? 